/**
 * FileContentManager is a Java based file manager desktop application, it can
 * show, edit and manipulate the content of the files archived inside a zip.
 * 
 * Copyright (C) 2007
 * 
 * Created by Camila Sanchez [http://mimix.wordpress.com/], Rafael Naufal
 * [http://rnaufal.livejournal.com] and Rodrigo [rdomartins@gmail.com]
 * 
 * FileContentManager is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License as published by the
 * Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with FileContentManager; if not, write to the Free Software Foundation,
 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */
/*
 * Created on 02/06/2007 10:08:13
 */
package br.com.jteam.jfcm.gui.adapter;

import java.awt.Image;

import br.com.jteam.jfcm.gui.PresentationFile;
import br.com.jteam.jfcm.gui.RenderedFileType;
import br.com.jteam.jfcm.model.File;
import br.com.jteam.jfcm.model.FileType;
import br.com.jteam.jfcm.model.services.ShowFileContentService;
import br.com.jteam.jfcm.model.services.exception.ShowFileContentServiceException;

/**
 * <p>
 * Implementa&ccedil;&atilde;o do adaptador do servi&ccedil;o respons&aacute;vel
 * pela visualiza&ccedil;&atilde;o de arquivos renderiz&aacute;veis pelo
 * sistema. {@link br.com.minaurod.fcm.model.FileType#ZIP}
 * 
 * @author Rafael Naufal <rafael.naufal@gmail.com>
 * @since 1.0
 * @version $Id$
 */
public class ShowFileContentAdapterImpl implements ShowFileContentAdapter
{
	/**
	 * <p>
	 * Refer&ecirc;ncia para o servi&ccedil;o de visualiza&ccedil;&atilde;o de
	 * arquivos renderiz&aacute;veis.
	 */
	private ShowFileContentService showFileContentService;

	/**
	 * <p>
	 * Construtor.
	 * 
	 * @param showFileContentService -
	 *            servi&ccedil;o de visualiza&ccedil;&atilde;o de arquivos
	 *            renderiz&aacute;veis pelo sistema.
	 * @throws IllegalArgumentException -
	 *             Caso o visualiza&ccedil;&atilde;o de arquivos
	 *             renderiz&aacute;veis pelo sistema seja nulo.
	 */
	public ShowFileContentAdapterImpl(ShowFileContentService showFileContentService)
	{
		if (showFileContentService == null)
		{
			throw new IllegalArgumentException("ShowFileContentservice canoot be null");
		}
		this.showFileContentService = showFileContentService;
	}

	/**
	 * <p>
	 * Cria uma inst&acirc;ncia de um tipo de arquivo espec&iacute;fico cujo
	 * conte�do �e renderiz&aacute;vel pela aplica&ccedil;&atilde;o.
	 * 
	 * @param presentationFile -
	 *            arquivo cujo conte�do deve ser renderiz&aacute;vel.
	 * @return - uma inst&acirc;ncia espec&iacute;fica do arquivo de tipo ({@link
	 *         br.com.minaurod.fcm.model.FileType}) renderiz&aacute;vel pela
	 *         aplica&ccedil;&atilde;o.
	 * @throws ShowFileContentAdapterException -
	 *             Caso o arquivo seja nulo ou seu tipo n&atilde;o seja
	 *             renderiz&aacute;vel pela aplica&ccedil;&atilde;o.
	 * @see br.com.minaurod.fcm.gui.adapter.ShowFileContentAdapter#prepareFileToView(PresentationFile
	 *      presentationFile)
	 */
	public PresentationFile<?> prepareFileToView(PresentationFile<?> presentationFile) throws ShowFileContentAdapterException
	{
		if (presentationFile == null)
		{
			throw new IllegalArgumentException("PresentationFile cannot be null");
		}
		try
		{
			File file =
							showFileContentService.createSpecificFileToBeViewed(presentationFile.getName(),
																				presentationFile.getPath());
			FileType fileType = FileType.getFileTypeByFileName(file.getName());
			RenderedFileType renderedFileType =
							RenderedFileType.getRenderedFileType(fileType);
			PresentationFile<?> presentationFileToBeViewed;
			if (renderedFileType == RenderedFileType.TEXT)
			{
				presentationFileToBeViewed =
								new PresentationFile<String>(	presentationFile.getName(),
																presentationFile.getPath(),
																fileType);
			} else
			{
				presentationFileToBeViewed =
								new PresentationFile<Image>(presentationFile.getName(),
															presentationFile.getPath(),
															fileType);
			}
			presentationFileToBeViewed.setRenderedFileType(renderedFileType);
			setContent(presentationFileToBeViewed);
			return presentationFileToBeViewed;
		} catch (ShowFileContentServiceException ex)
		{
			throw new ShowFileContentAdapterException(ex);
		}
	}

	@SuppressWarnings("unchecked")
	private void setContent(PresentationFile presentationFile) throws ShowFileContentAdapterException
	{
		ShowFileContentHelper showFileContentHelper =
						new ShowFileContentHelper(presentationFile);
		presentationFile.setContent(showFileContentHelper.createContent());
	}
}
